#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <vector>


/*--------------- 创建多线程 --------------------------*/

void* thread(void * args)
{
    //std::cout << args <<std::endl;
    //std::cout << "线程或id:" << pthread_self() <<std::endl;

    //pthread_detach(pthread_self());
    std::string name = static_cast<char*>(args);

    int cnt = 5;
    while(cnt--)
    {
        std::cout << name << ";线程id ->     " << pthread_self() << std::endl;
        sleep(1);
    }


    return nullptr;
}


int main()
{
    int num = 10;
    std::vector<pthread_t> rids;
    for(int i = 0; i <= num; i++)
    {
        pthread_t rid;
        char *id = new char[64];
        //char id[64];
        snprintf(id,64,"thread-%d",i);
        int n = pthread_create(&rid,nullptr,thread,id);
        std::cout << "main创建线程thread" << i  << " -> " << rid << std::endl;
        if(n == 0)
        {
            rids.push_back(rid);    //如果创建成功，使用顺序表进行管理(以便进行join时候能够找到) -> 尾插
        }
        else
        {
            std::cout << "创建线程失败" << std::endl;
        }
        sleep(1);
    }

    for(int i = 0; i <= num; i++)
    {
        std::cout << "join success" <<std::endl;
        pthread_join(rids[i],nullptr);
    }

    

    return 0;
}











/*--------------- 创建线程传参 -> 类 --------------------------*/
// -> 线程分离


// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b)
//     {
//     }
//     int Execute()
//     {
//         return _a + _b;
//     }

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int revalue) : _revalue(revalue)
//     {
//     }

//     int Getvalue()
//     {
//         return _revalue;
//     }

// private:
//     int _revalue;
// };

// void *thread(void *arg)
// {
//     pthread_detach(pthread_self());
//     Task *t = static_cast<Task *>(arg); // 将传递过来的arg强转成 Task*类型
//     Result *r = new Result(t->Execute());

//     std::cout << "新线程" << pthread_self() << std::endl;
//     std::cout << "进程数值为:" << r->Getvalue() << std::endl;

//     return nullptr;
// }

// int main()
// {

//     pthread_t rid;
//     Task *t = new Task(10, 20);
//     pthread_create(&rid, nullptr, &thread, t);

//     std::cout << "main创建的线程" << rid << std::endl;
    
//     sleep(1);   //等待1s让线程分离

//     void *ret;
//     // pthread_join(rid,&ret);

//     pthread_join(rid, nullptr); //线程分离之后建议不要join，因为线程分离之后的join是不确定性的

//     return 0;
// }

// int cnt = 100;

// void *thread(void *args)
// {
//     pthread_t rid;
//     rid = pthread_self();
//     while (true)
//     {

//         std::cout << "我是子线程，我的线程名字:" << rid << std::endl;
//         cnt++;
//         sleep(1);
//         if(cnt == 105)
//         //return (void*)rid;  //从线程函数return。这种⽅法对主线程不适⽤,从main函数return相当于调⽤exit。
//         pthread_exit(nullptr);  //线程可以调用pthread_exit进行终止
//         //int a /= 0;
//         // int a = 0;
//         // a = a / 0;
//     }
//     return (void *)rid;
// }

// int main()
// {
//     pthread_t rid;
//     rid = pthread_self();   //获取线程ID
//     pthread_create(&rid, nullptr, thread, nullptr);
//     while (true)
//     {
//         std::cout << "我是主线程，我的线程名字:" << rid << std::endl;
//         sleep(1);
//     }

//     pthread_join(rid,nullptr); //等待进程退出，否则会有内存泄漏问题
//     return 0;
// }